package com.enzoism.springboot.dive.bis.pool;

import java.util.Random;
import java.util.concurrent.Semaphore;

/**
 * 模拟一个只允许5个线程执行的程序
 * 所以结果就是每一个锁释放之后，才有一个线程获取锁
 * 和synchronized的区别是就是，当前方法允许指定的线程个数去处理任务，有点类似于coolPoolSize
 * 和【线程池】（coolPoolSie和BlockingQueue比较起来，这个算是低配版的线程控制了）
 */
public class SemaphoreTest {

    public static void main(String[] args) {
        int taskNum = 10;
        Semaphore semaphore = new Semaphore(taskNum);
        for (int i = 0; i < 50; i++) {
            new Thread(new SemaphoreRunnable(semaphore, i)).start();
        }
    }

    public static class SemaphoreRunnable implements Runnable {
        private Semaphore semaphore;
        private int num;

        public SemaphoreRunnable(Semaphore semaphore, int num) {
            this.semaphore = semaphore;
            this.num = num;
        }

        @Override
        public void run() {
            try {
                semaphore.acquire();
                System.out.println("---->工人" + num + "占用一个锁，开始工作。。。。。");
                // 模拟线程操作
                Thread.sleep(new Random().nextInt(1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.println("---->工人" + num + "进行锁释放");
                semaphore.release();
            }
        }
    }
}
